package com.kakaxi.mybilibili.base;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;

import com.kakaxi.mybilibili.R;

/**
 * 基础通用活动类
 */
public abstract class BaseActivity extends AppCompatActivity {

    protected static Context context;
    protected SharedPreferences settings;

    /** 工具栏 **/
    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        context = this;
        // 设置活动的界面
        int contentViewId = getContentViewId();
        if (contentViewId != 0) {
            setContentView(contentViewId);
        }
        initToolbar();
        preliminary();
    }

    /**
     * 初始化工具栏
     */
    private void initToolbar() {
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        if (toolbar != null) {
            setSupportActionBar(toolbar);
        }
    }

    /**
     * 展示信息前的准备工作在这个方法中处理
     */
    protected void preliminary() {
        // 初始化视图
        setupViews();
        // 初始化数据
        initData();
    }

    /**
     * 布局id
     *
     * @return
     */
    protected abstract int getContentViewId();

    /**
     * 初始化视图
     */
    protected abstract void setupViews();

    /**
     * 初始化数据
     */
    protected abstract void initData();

    /**
     * 进入指定活动并携带数据包
     *
     * @param cls    跳转的活动类
     * @param bundle 数据包
     */
    public void goActivity(Class<?> cls, Bundle bundle) {
        Intent intent = new Intent(getBaseContext(), cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }

    /**
     * 进入指定活动类 记得在xml注册
     *
     * @param cls 将打开的活动类
     */
    public void goActivity(Class<?> cls) {
        this.goActivity(cls, null);
    }

    /**
     * 进入指定活动类并完成现在的活动并携带数据包
     *
     * @param cls    跳转的活动类
     * @param bundle 数据包
     */
    public void goActivityAndFinish(Class<?> cls, Bundle bundle) {
        this.goActivity(cls, bundle);
        finish();
    }

    /**
     * 进入指定活动类并完成现在的活动
     *
     * @param cls 跳转的活动类
     */
    public void goActivityAndFinish(Class<?> cls) {
        this.goActivity(cls, null);
        finish();
    }

    /**
     * 携带参数进入指定活动类并要求返回结果
     *
     * @param cls         跳转的活动类
     * @param bundle      参数
     * @param requestCode 请求代号
     */
    public void goActivityAndResult(Class<?> cls, Bundle bundle, int requestCode) {
        Intent intent = new Intent(this, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
    }

    // toast处理器
    private static Handler toastHandler = new Handler() {

        // 处理信息
        public void handleMessage(android.os.Message msg) {
            // 发送toast
            Toast.makeText(context, msg.obj.toString(), Toast.LENGTH_SHORT)
                    .show();
        }

        ;
    };

    /**
     * 调用toastHandler弹出toast
     *
     * @param text toast的信息
     */
    public void toastHandler(String text) {
        toastHandler.obtainMessage(0, text).sendToTarget();
    }

    /**
     * 写入xml文件
     *
     * @param name  xml文件名
     * @param key   键
     * @param value 键值
     */
    public void writeXML(String name, String key, String value) {
        settings = getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putString(key, value);
        editor.commit();
    }

    /**
     * 将boolean写入xml中
     *
     * @param name  xml文件名
     * @param key   键名
     * @param value 键值
     */
    public void writeXMLBoolean(String name, String key, Boolean value) {
        settings = getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }

    /**
     * 获取xml键值
     *
     * @param name xml文件名
     * @param key  键名
     * @return 如果返回空证明键值不存在
     */
    public String readXML(String name, String key) {
        settings = getSharedPreferences(name, Context.MODE_PRIVATE);
        if (settings.contains(key)) {
            return settings.getString(key, null);
        } else {
            return null;
        }
    }

    /**
     * 读取xml中的boolean
     *
     * @param name xml文件名
     * @param key  键名
     * @return 返回读取的布尔值，不能读取时返回null
     */
    public Object readXMLBoolean(String name, String key) {
        settings = getSharedPreferences(name, Context.MODE_PRIVATE);
        if (settings.contains(key)) {
            return settings.getBoolean(key, false);
        } else {
            return null;
        }
    }

    /****
     * 删除xml里面的键值
     *
     * @param name xml的文件名
     * @param key  键值
     */
    public void removeXML(String name, String key) {
        settings = getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.remove(key);
        editor.commit();
    }

    /**
     * 设置是否显示actionbar后退按钮
     *
     * @param isShow 是否显示
     */
    protected void setActBarBackBtn(boolean isShow) {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(isShow);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // actionbar 后退按钮响应
            case android.R.id.home: {
                finish();
                break;
            }
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * 获取工具栏
     *
     * @return 工具栏
     */
    protected Toolbar getToolBar() {
        return toolbar;
    }

    /**
     * 显示返回按钮
     */
    protected void showBackBtn() {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    /**
     * 显示软键盘
     *
     * @param inputView 输入的视图
     */
    protected void showSoftInput(View inputView) {
        inputView.requestFocus();
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context
                .INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(inputView, 0);

    }

    /**
     * 隐藏软键盘
     *
     * @param inputView 输入的视图
     */
    protected void hideSoftInput(View inputView) {
        // 获取焦点间接取消了输入框的焦点
        inputView.clearFocus();
        // 关闭软键盘
        InputMethodManager imm = (InputMethodManager) getSystemService(Context
                .INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(inputView.getWindowToken(), 0);
    }

}
